//这是antlr v4 的语法描述文件
//g4 文件应该使用unicode 无bom头,当然你如果文件里不出现中文,就简单的多
//中文注释这么有趣,我当然要用了
//grammar math4 表示语法的名字,antlr要求这个名字必须和文件名相同

grammar math4;


//src expr:expr token atom|atom
//dest expr:atom (token expr)?
       
//==================================================================
//小写字母开头的就是语法节点  ，冒号 相当于产生式 root=>expr
root : expr;// we use root for all

expr : expr_add|expr_mul|INT|FLOAT|expr_group;

//产生式使用三个特殊符号连接  ? + *  ,括号用作优先级控制，点用作通配符，所以要使用这些符号的话，需要单引号括起来
//?表示0 个或 1个, + 表示>=1个, *表示0~1个


expr_group :  ('(' SPACE* expr SPACE*')' );
//
//
expr_add : (INT|FLOAT|expr_group|expr_mul) (SPACE* TOKEN_ADD SPACE* expr);
expr_mul : (INT|FLOAT|expr_group) (SPACE* TOKEN_MUL SPACE* (expr_mul|INT|FLOAT|expr_group));

//少用些中间节点,ast就会简单，比如这个expr_atom我就把他优化掉了
//expr_atom:INT|FLOAT|expr_group;


//==========================================================
//lex part
//大写字母开头的是词法节点，分词细一点会减轻很多语法识别的压力

TOKEN_MUL:'*'|'/';
TOKEN_ADD : '+'|'-';

//->skip表示这个符号文档里不需要,做完词法分析就可以扔了
SPACE: ' ' ->skip;

NEWLINE : [\r\n]+  ->skip;
INT     : [0-9]+ ; 
FLOAT     : [0-9]+ '.' [0-9]+ ; 